class PubSub {
  subscribers = {} // 存放订阅者
  /**
   * 订阅
   * @param eventName 事件名称
   * @param callback
   */
  on(eventName, callback) {
    if (!this.subscribers[eventName]) {
      this.subscribers[eventName] = [] // 初始化
    }
    this.subscribers[eventName].push(callback)
  }
  /**
   * 取消订阅
   * @param eventName 事件名称
   * @param callback
   */
  off(eventName, callback) {
    if (this.subscribers[eventName]) {
      // 订阅函数的索引
      const index = this.subscribers[eventName].findIndex(item => item === callback)
      if (index !== -1) {
        this.subscribers[eventName].splice(index, 1)
      }
    }
  }
  // 发布
  emit(eventName, data) {
    if (this.subscribers[eventName]) {
      this.subscribers[eventName].forEach(callback => {
        callback(data)
      })
    }
  }
}

const pubsub = new PubSub()
function callback1(data) {
  console.log('订阅1收到', data)
}
function callback2(data) {
  console.log('订阅2收到', data)
}
function callback3(data) {
  console.log('订阅3收到', data)
}
pubsub.on('message', callback1) // 订阅消息
pubsub.on('advertisement', callback2) // 订阅广告
pubsub.on('notice', callback2) // 订阅通知
pubsub.emit('message', '今天天气状况不错，适合出游') // 发布消息
pubsub.emit('advertisement', '全场5折') // 发布广告
pubsub.emit('notice', '明天放假一天') // 发布通知
pubsub.off('message', callback2) // 取消订阅
